package com.pig4cloud.pig.common.file.core;

import org.springframework.beans.factory.InitializingBean;

import java.io.InputStream;
import java.util.List;

/**
 * 文件操作模板接口
 * <p>
 * 定义文件存储的统一操作接口，支持本地存储和OSS存储
 * </p>
 *
 * @author lengleng
 * @date 2022/4/19
 */
public interface FileTemplate extends InitializingBean {

	/**
	 * 创建Bucket存储桶
	 * @param bucketName 存储桶名称
	 */
	void createBucket(String bucketName);

	/**
	 * 获取所有Bucket列表
	 * @return Bucket对象列表
	 */
	List<? extends Object> getAllBuckets();

	/**
	 * 删除指定Bucket
	 * @param bucketName 存储桶名称
	 */
	void removeBucket(String bucketName);

	/**
	 * 上传文件
	 * @param bucketName 存储桶名称
	 * @param objectName 对象名称（文件名）
	 * @param stream 文件输入流
	 * @param contextType 文件MIME类型
	 * @throws Exception 上传异常
	 */

	/**
	 * 上传文件（自动检测文件类型）
	 * @param bucketName 存储桶名称
	 * @param objectName 对象名称（文件名）
	 * @param stream 文件输入流
	 * @throws Exception 上传异常
	 */

	/**
	 * 获取文件对象
	 * @param bucketName 存储桶名称
	 * @param objectName 对象名称（文件名）
	 * @return 文件对象
	 */
	Object getObject(String bucketName, String objectName);

	/**
	 * 删除文件对象
	 * @param bucketName 存储桶名称
	 * @param objectName 对象名称（文件名）
	 * @throws Exception 删除异常
	 */
	void removeObject(String bucketName, String objectName) throws Exception;

	/**
	 * @throws Exception
	 */
	@Override
	default void afterPropertiesSet() throws Exception {
	}

	/**
	 * 根据前缀查询文件列表
	 * @param bucketName 存储桶名称
	 * @param prefix 文件名前缀
	 * @param recursive 是否递归查询
	 * @return 文件对象列表
	 */
	List<? extends Object> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive);

}
